PostgreSQL WAL日志 简介

1 背景知识

000000010000000000000001

事务日志(transaction log)是数据库的关键组件,因为当出现系统故障时,任何数据库管理系统都不允许丢失数据。
 
 事务日志是数据库系统中所有 变更(change) 与 **行为(action)**的历史记录,当诸如电源故障,或其他服务器错误导致服务器崩溃时,它被用于确保数据不会丢失。由于日志包含每个已执行事务的相关充分信息,因此当服务器崩溃时,数据库服务器应能通过重放事务日志中的变更与行为来恢复数据库集群。

​ 在计算机科学领域,WAL是Write Ahead Logging的缩写,它指的是将变更与行为写入事务日志的协议或规则;而在PostgreSQL中,WAL是Write Ahead Log的缩写。在这里它被当成事务日志的同义词,而且也用来指代一种将行为写入事务日志(WAL)的实现机制。虽然有些令人困惑, 但本文将使用PostgreSQL中的定义。

​ WAL机制在7.1版本中首次被实现,用以减轻服务器崩溃的影响。它还是**时间点恢复(Point-in-Time Recovery PIRT)流复制(Streaming Replication, SR)**实现的基础,这两者将分别在 备份与恢复流复制中介绍。

​ 尽管理解WAL机制对于管理、集成PostgreSQL非常重要,但由于它的复杂性,不可能做到简要介绍。因此本章将会对WAL做一个完整的解释。第一节描绘了WAL的全貌,介绍了一些重要的概念与关键词。接下来的小节中会依次讲述其他主题:

WAL段文件名=timelineId+(uint32)LSN116M256+(uint32)(LSN116M)%256

第一个WAL段文件名是000000010000000000000001,如果第一个段被XLOG记录写满了,就会创建第二个段000000010000000000000002,后续的文件名将使用升序。在0000000100000000000000FF被填满之后,就会使用下一个文件000000010000000100000000。通过这种方式,每当最后两位数字要进位时,中间8位数字就会加一。与之类似,在0000000100000001000000FF被填满后,就会开始使用000000010000000200000000,依此类推。